package main
import (
	"fmt"
	"net" // 做网络开发时，net包含我们需要所有的方法和函数
	_"io"
)


func process(conn net.Conn){

	// 这里 我们循环的接收客户端发送的数据
	defer conn.Close() // 关闭 conn
	for{
		// 创建一个新的切片
		buf := make([]byte,1024)
		// conn.Read(buf)
		// 1. 等待客户端通过conn 发送消息
		// 2. 如果客户端没有write[发送] 那么协程就阻塞在这里
		// fmt.Printf("服务器在等待客户端%s 发送消息\n",conn.RemoteAddr().String())
		n,err:=conn.Read(buf) // 从 conn 读取 n 字节长度
		if err != nil{
			fmt.Printf("客户端退出 err=%v",err)
			return // !!! 不return 服务端会一直尝试读取客户端发来的数据
		}
		// 显示客户端发送的内容到服务器的终端
		fmt.Print(string(buf[:n])) // 不保留n 可能buf 里面有奇怪的东西
	}
}

func main() {
	fmt.Println("服务器端开始监听...")
	//net.Listen("tcp","0.0.0.0:8888")	
	// 1. tcp 表示使用的网络协议是tcp
	// 2. 0.0.0.0:8888表示本地监听 8888端口
	listen ,err:=net.Listen("tcp","127.0.0.1:8888")
	if err!=nil{
		fmt.Println("listen err=",err)
		return
	}

	defer listen.Close()// 延时关闭 listen

	// 循环等待客户端来连接我
	for{
		// 等待客户端链接
		fmt.Println("等待客户端连接..")
		conn,err:=listen.Accept() // 等待连接
		if err !=nil{
			fmt.Println("Accept()err=",err)
		}else{
			fmt.Printf("Accept() suc con=%v 客户端 ip=%v\n", conn, conn.RemoteAddr().String())
			
		}
		//这里准备其一个协程，为客户端服务 
		go process(conn)
	}

	//fmt.Printf("listen suc=%v\n", listen)
}
